iT邦幫忙

2025 iThome 鐵人賽

DAY 10
0

前言

在說明完了Java所有的打包方式JAR、WAR、EAR後,你可能會再進一步思考如何將Java的應用程式打包成 Docker Image 來部署你的應用程式。今天我們就來看看如何透過Maven Plugin來幫我們完成這件事

部署至Kubernetes流程

  1. mvn clean package - Maven 打包
  2. 撰寫 Dockerfile
  3. docker build - 建構 Docker Image
  4. docker push - 推送到 Registry
  5. kubectl apply - 部署至 Kubernetes

Maven Docker plugin

插件 開發者 特色 適用場景
jib-maven-plugin Google 無需 Docker daemon,極快建構 雲原生應用,CI/CD 環境
dockerfile-maven-plugin Spotify 基於 Dockerfile,簡單易用 已有 Dockerfile 的專案
docker-maven-plugin fabric8io 功能最豐富,支援複雜配置 企業級應用,複雜部署需求

註:以上由Claude AI整理

範例演示一:使用 jib-maven-plugin

1.創建maven web專案

mvn archetype:generate -DarchetypeGroupId=org.apache.maven.archetypes -DarchetypeArtifactId=maven-archetype-webapp -DarchetypeVersion=1.5

2.pom配置

<groupId>com.mycompany.demodocker</groupId>
  <artifactId>demodocker</artifactId>
  <version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<!--
    Docker 常用指令
    docker run -d -p 8080:8080 mycompany/demodocker:1.0-SNAPSHOT
    docker ps                                      # 查看運行的 container
    docker ps -a                                   # 查看所有運行與未運行的 container
    docker images                                  # 查看現行的映像檔
    docker rm <container_id>                       # 刪除 container
    docker rmi <image_id>                          # 刪除 image
    docker logs <container_id>                     # 查看 container 日誌
  -->
 <build>
  <!-- 其他略 -->
  <plugins>
    <plugin>
      <groupId>com.google.cloud.tools</groupId>
      <artifactId>jib-maven-plugin</artifactId>
      <version>3.4.0</version>
      <configuration>
        <from>
          <image>tomcat:jre21</image>
        </from>
        <to>
          <image>docker.io/mycompany/${project.artifactId}:${project.version}</image>
          <!-- 如果要 push 到私有 registry -->
          <!-- <auth> <username>xxx</username> <password>xxx</password> </auth> -->
        </to>
        <container>
          <!-- 設置WAR部署路徑 -->
          <appRoot>/usr/local/tomcat/webapps/ROOT</appRoot>
          <jvmFlags>
            <jvmFlag>-Xms512m</jvmFlag>
            <jvmFlag>-Xmx1024m</jvmFlag>
          </jvmFlags>
          <ports>
            <port>8080</port>
          </ports>
          <labels>
            <version>${project.version}</version>
          </labels>
        </container>
      </configuration>
      <executions>
        <execution>
          <phase>package</phase>
          <goals>
            <!-- 部署到local -->
            <goal>dockerBuild</goal>
            <!-- 部署到私人repository
            <goal>jib:build</goal> -->
          </goals>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>

3.執行mvn package
完成本地端image創建
https://ithelp.ithome.com.tw/upload/images/20251012/20128084mtNfQ0BLDj.png

4.確認docker images
https://ithelp.ithome.com.tw/upload/images/20251012/20128084hoFhKh8Ji9.png

5. 執行docker run
docker run -d -p 8080:8080 mycompany/demodocker:1.0-SNAPSHOT
https://ithelp.ithome.com.tw/upload/images/20251012/20128084TIRLr5T7qY.png

範例演示二:使用 dockerfile-maven-plugin

1.修改pom設定

<build>
<!-- 其他略 -->
 <plugins>
      <plugin>
        <groupId>com.spotify</groupId>
        <artifactId>dockerfile-maven-plugin</artifactId>
        <version>1.4.13</version>
        <configuration>
          <repository>mycompany/${project.artifactId}</repository>
          <tag>${project.version}</tag>
          <buildArgs>
            <JAR_FILE>target/${project.build.finalName}.war</JAR_FILE>
          </buildArgs>
        </configuration>
        <executions>
          <execution>
            <id>default</id>
            <phase>package</phase>
            <goals>
              <goal>build</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
</build>

2.創建Dockerfile

# 使用 Tomcat 作為基礎映像檔
FROM tomcat:jre21

# 移除預設的 webapps 內容
RUN rm -rf /usr/local/tomcat/webapps/*

# 複製 WAR 檔案到 Tomcat webapps/ROOT 目錄
ARG JAR_FILE
COPY ${JAR_FILE} /usr/local/tomcat/webapps/ROOT.war

# 設置 JVM 參數
ENV JAVA_OPTS="-Xms512m -Xmx1024m"

# 暴露 8080 port
EXPOSE 8080

# 添加版本標籤
LABEL version="1.0-SNAPSHOT"

# 啟動 Tomcat
CMD ["catalina.sh", "run"]

3.執行mvn package
https://ithelp.ithome.com.tw/upload/images/20251012/20128084wK2D7h8Wsq.png

4.確認docker images
https://ithelp.ithome.com.tw/upload/images/20251012/20128084Um2JPGyNBk.png

5. 執行docker run
docker run -d -p 8080:8080 mycompany/demodocker:1.0-SNAPSHOT
https://ithelp.ithome.com.tw/upload/images/20251012/20128084dV6XHIJpWL.png

小結

本章我們介紹了如何將Java Web專案使用 Maven plugin自動化建構 Docker Image並且在docker成功運行,明天來我們來看看Maven如何跟CI/CD工具進行整合

Reference


上一篇
Day25 - EAR Packaging and Deploy
下一篇
Day27 - CI/CD Pipelines with Maven, Gitea, and Jenkins
系列文
我們與Maven的距離29
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言